IA-32指令类型
IA-32的标志寄存器
- 6个条件标志
OF (Overflow Flag) 溢出标志位
溢出标志OF用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0。SF (Sign Flag) 符号标志
符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。在微机系统中,有符号数采用补码表示法,所以,SF也就反映运算结果的正负号。运算结果为正数时,SF的值为0,否则其值为1。ZF (Zero Flag) 零标志
零标志ZF用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志位。CF (Carry Flag) 进位标志
进位标志CF主要用来反映运算是否产生进位或借位。如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。使用该标志位的情况有:多字(字节)数的加减运算,无符号数的大小比较运算,移位操作,字(字节)之间移位,专门改变CF值的指令等。
AF (Auxiliary Carry Flag) 辅助进位标志
在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0:
- 在字操作时,发生低字节向高字节进位或借位时;
- 在字节操作时,发生低4位向高4位进位或借位时。
PF(Parity Flag) 奇偶标志
奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。如果“1”的个数为偶数,则PF的值为1,否则其值为0。
- 3个控制标志
DF (Direction Flag) 方向标志(自动变址方向是增还是减)
方向标志DF用来决定在串操作指令执行时有关指针寄存器发生调整的方向。IF (Interruput Flag) 中断允许标志(仅对外部可屏蔽中断有用)
中断允许标志IF是用来决定CPU是否响应CPU外部的可屏蔽中断发出的中断请求。但不管该标志为何值,CPU都必须响应CPU外部的不可屏蔽中断所发出的中断请求,以及CPU内部产生的中断请求。
- 当IF=1时,CPU可以响应CPU外部的可屏蔽中断发出的中断请求;
- 当IF=0时,CPU不响应CPU外部的可屏蔽中断发出的中断请求。
TF (Trap Flag) 陷阱标志(是否是单步跟踪状态)
当追踪标志TF被置为1时,CPU进入单步执行方式,即每执行一条指令,产生一个单步中断请求。这种方式主要用于程序的调试。
IA-32 指令系统概述
- IA-32是典型的CISC(复杂指令集计算机)风格ISA
8个通用寄存器
2个专用寄存器:
- EIP(PC) EIP寄存器主要用于存放当前代码段即将被执行的下一条指令的偏移,但其本质上并不能直接被指令直接访问。
- 标志寄存器EFLAGS
6个段寄存器(间接给出段基址)
存储器地址空间为4GB,按字节编址,小端方式
寻址方式
- 立即
- 寄存器
存储器 段基址+有效地址(位移量)
[B]——基址寄存器编号 [I]——变址寄存器编号 s——比例因子 A——位移量 这些信息可以排列组合
- 相对寻址(指令)
变长指令字,变长操作码
- 汇编语言格式
- Inter格式汇编
- AT&T格式汇编
IA-32指令类型
传送指令
- 通用数据传送指令
MOV:一般传送
==注意: MOV指令不能在两个存储器之间进行数据直接传送。 MOV指令不能在两个段寄存器之间进行数据直接传送。==
MOVS:符号扩展传送
MOVZ: 零扩展传送
XCHG: 数据交换
PUSH/POP: 入栈/出栈
- 地址传送指令
LEA 加载有效地址
- 输入输出指令
IN和OUT: I/O端口与寄存器之间的交换
- 标志传送指令
PUSHF、POPF: 将EFLAG压栈,将栈顶内容送入EFLAG
定点算术运算指令
- 加减(影响标志,不区分无/带符号)
ADD SUB
- 增1/减1运算(影响除CF以外的标志,不区分无/带符号)
INC DEC
- 取负运算(影响标志,若对0取负,则结果为0且CF清0,否则CF置1)
NEG
- 比较运算(做减法得到标志,不区分无/带符号)
CMP
- 乘/除运算(不影响标志,区分无/带符号)
MUL/IMUL 无符号乘/带符号乘
DIV/IDIV 无符号除/带符号除
按位运算
- 逻辑运算
NOT 非
AND 与
OR 或
XOR 异或
TEST 做“与”测试,仅影响标志
- 移位运算 (左/右移时,最高/最低位送CF)
SHL/SHR:逻辑左/右移
SAL/SAR: 算术左/右移 左移判溢出,右移高位补符
ROL/ROR 循环左/右移
RCL/RCR 带进位循环左/右移
控制转移指令
- 无条件转移指令
JMP DST 无条件转移到目标指令DST处执行
- 条件转移
Jcc DST cc为条件码,根据标志(条件码)判断是否满足条件,若满足,则转移道目标指DST处执行,否则顺序执行
- 条件设置
SETcc DST 按条件码cc判断的结果保存到DST(是一个8为寄存器)
- 调用和返回指令(用于过程调用)
- 中断指令
CALL DST 返回地址RA入栈,转DST处执行
RET 从栈中取出返回地址RA,转到RA处执行
x87浮点处理指令
C语言语句的机器级表示
过程(函数)的结构
一个C过程的大致结构如下
- 准备阶段
形成帧底:push指令和mov指令
生成栈帧(如果需要的话):sub指令或and指令
保存现场(如果有被调用者保存寄存器): mov指令
- 过程(函数)体
分配局部变量空间,并赋值
具体处理逻辑,如果遇到函数调用时
- 准备参数: 将实参送栈帧入口参数处
- CLLL指令: 保存返回地址并转被调用函数
在EAX中准备返回参数
- 结束阶段
- 退栈: leave指令或pop指令
选择结构
循环结构
==为提高程序性能,能用非递归方式执行最好用非递归方式。==